<?php
/**
 * @author		João Batista Neto
 * @brief		Objetos que trabalham com requisição e retorno da API BuscaPé
 * @package		dso.buscape.result
 */

require_once 'rpo/base/Object.php';
require_once 'dso/buscape/result/BuscapeResult.php';
require_once 'dso/buscape/result/type/BuscapeAddress.php';
require_once 'dso/buscape/result/type/BuscapeCategory.php';
require_once 'dso/buscape/result/type/BuscapeContact.php';
require_once 'dso/buscape/result/type/BuscapeItem.php';
require_once 'dso/buscape/result/type/BuscapeLink.php';
require_once 'dso/buscape/result/type/BuscapeOffer.php';
require_once 'dso/buscape/result/type/BuscapeParcel.php';
require_once 'dso/buscape/result/type/BuscapeProduct.php';
require_once 'dso/buscape/result/type/BuscapeRating.php';
require_once 'dso/buscape/result/type/BuscapeResultDetails.php';
require_once 'dso/buscape/result/type/BuscapeSeller.php';
require_once 'dso/buscape/result/type/BuscapeSpecification.php';
require_once 'dso/buscape/result/type/BuscapeThumbnail.php';
require_once 'dso/buscape/result/type/BuscapeValue.php';

/**
 * @brief	Builder para construção da resposta
 * @class	BuscapeResultBuilder
 */
class BuscapeResultBuilder extends Object {
	/**
	 * @brief	Instância do objeto BuscapeResult
	 * @var		BuscapeResult
	 */
	private $result;

	/**
	 * @brief	Constroi um objeto de endereço
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeAddress
	 */
	public function buildAddress( array $data = array() ){
		$address = BuscapeAddress::createInstance( $data );

		return $address;
	}

	/**
	 * @brief	Constroi a lista de categorias
	 * @param	$data array Lista de categorias
	 * @return	BuscapeResultBuilder
	 */
	public function buildCategories( array $data = array() ){
		foreach ( $data as $item ){
			if ( $item[ 1 ] ){
				$this->result->addCategory( $item[ 0 ] );
			}
		}

		return $this;
	}

	/**
	 * @brief	Constroi o objeto de contato
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeContact
	 */
	public function buildContact( array $data = array() ){
		$contact = BuscapeContact::createInstance( $data );

		return $contact;
	}

	/**
	 * @brief	Constroi o objeto de item
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeItem
	 */
	public function buildItem( array $data = array() ){
		return BuscapeItem::createInstante( $data );
	}

	/**
	 * @brief	Constroi um Iterator para listas
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	RecursiveComponentIterator
	 */
	public function buildIterator( array $data = array() ){
		return new RecursiveComponentIterator();
	}

	/**
	 * @brief	Constroi um objeto de link
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeLink
	 */
	public function buildLink( array $data = array() ){
		return BuscapeLink::createInstante( $data );
	}

	/**
	 * @brief	Constroi um objeto de oferta
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeOffer
	 */
	public function buildOffer( array $data = array() ){
		$offer = BuscapeOffer::createInstance( $data );

		return $offer;
	}

	/**
	 * @brief	Constroi um objeto de parcelas
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeParcel
	 */
	public function buildParcel( array $data = array() ){
		$parcel = BuscapeParcel::createInstance( $data );

		return $parcel;
	}

	/**
	 * @brief	Constroi um objeto de produto
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeProduct
	 */
	public function buildProduct( array $data = array() ){
		$buscapeProduct = BuscapeProduct::createInstance( $data );

		$this->result->addProduct( $buscapeProduct );

		return $buscapeProduct;
	}

	/**
	 * @brief	Constroi um objeto de avaliação
	 * @param	$data array Lista de parâmetros para criação do objeto
	 * @return	BuscapeRating
	 */
	public function buildRating( array $data = array() ){
		return BuscapeRating::createInstance( $data );
	}

	/**
	 * @brief	Constroi o objeto de resultados da API do BuscaPé
	 * @param	$data array Opções para criação do objeto
	 * @return	BuscapeResultBuilder Este objeto
	 */
	public function buildResult( array $data = array() ){
		$this->result = BuscapeResult::createInstance( $data );

		return $this;
	}

	/**
	 * @brief	Constroi o objeto de detalhes do resultado
	 * @param	$data array Opções para criação do objeto
	 * @return	BuscapeResultBuilder Este objeto
	 */
	public function buildResultDetails( array $data = array() ){
		$this->result->setResultDetails( BuscapeResultDetails::createInstance( $data ) );

		return $this;
	}

	/**
	 * @brief	Constroi o objeto de vendedor
	 * @param	$data array Opções para criação do objeto
	 * @return	BuscapeSeller
	 */
	public function buildSeller( array $data = array() ){
		$seller = BuscapeSeller::createInstance( $data );

		return $seller;
	}

	/**
	 * @brief	Constroi um objeto de especificação
	 * @param	$data array Opções para criação do objeto
	 * @return	BuscapeSpecification
	 */
	public function buildSpecification( array $data = array() ){
		return BuscapeSpecification::createInstante( $data );
	}

	/**
	 * @brief	Constroi um objeto de imagem
	 * @param	$data array Opções para criação do objeto
	 * @return	BuscapeThumbnail
	 */
	public function buildThumbnail( array $data = array() ){
		$thumbnail = BuscapeThumbnail::createInstance( $data );

		return $thumbnail;
	}

	/**
	 * @brief	Constroi um objeto de valor
	 * @param	$data array Opções para criação do objeto
	 * @return	BuscapeValue
	 */
	public function buildValue( array $data = array() ){
		return BuscapeValue::createInstante( $data );
	}

	/**
	 * @brief	Recupera o objeto totalmente construído
	 * @return	BuscapeResult
	 */
	public function getResult(){
		return $this->result;
	}
}